package network;

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;
import java.nio.charset.StandardCharsets;

//自己模拟实现一个服务器的使用流程；
public class UdpEchoSever {
    //UDP协议类的使用；
    private DatagramSocket socket=null;
    public UdpEchoSever(int pot) throws SocketException {
        socket=new DatagramSocket(pot);//进行服务器的设置；（规定指定的端口进行使用）；
    }
    //进行启动服务器方法的构建；
    public void start() throws IOException {
        System.out.println("启动服务器");
        //只有启动了服务器，在后期无论那个时间段都有可能使用服务器，所用服务器要一直处于打开的状态；
        //所用使用while循环进行相关的操作；
        while(true){
            //1.服务器会收到来自客户端的各种需求；所以：
            //第一步进行：请求的获取与解析；
            //请求获取后需要将讲求的相关内容进行保存；所以需要设置一个可以存储请求的相关类；
            DatagramPacket requestPacket=new DatagramPacket(new byte[4096],4096);
            //此处的这个类就属于UDP数据报；其中byte数组是用来存储相关的读取的数据的；
            socket.receive(requestPacket);//进行读取网卡中的相关请求，并把请求存入到UDP数据报中。
            //在进行完请求数据的保存操作后，需要将该数据还原为原有的类型（即字符串类型，方便后续的响应操作）；
            String request=new String(requestPacket.getData(),0, requestPacket.getLength());
            //此处代码进行了四步操作：
            //1.requestPacket.getData();进行获取请求数据的字节形式；
            //2.requestPacket.getLength();进行获取字节数据的长度；
            //3.进行转换操作，将这些字节类型的数据转换成字符串类型的操作；
            //4.将这些值赋值该字符串变量request;

            //接下来；
            //进行服务器操作的第二步：根据请求计算响应操作；
            //由于此服务器：设定为：回响服务器；（即请求什么就回应什）
            //所用只需要进行简单地操作即可；
            String response =process(request);
            //接下进行第三步操作：服务器响应操作；
            DatagramPacket responsePacket=new DatagramPacket(response.getBytes(),response.getBytes().length,
                    requestPacket.getSocketAddress());
            //此段代码进行三步操作：
            //操作1：response.getBytes()获取加工后的请求数据报的字节形式；
            //操作2：response.getBytes().length//获取字节形式的长度；
            //操作3： requestPacket.getSocketAddress()进行获取发来客户端的源ip地址和源端口；
            //总结这三部操作的动机：为了进行回应操作做准备工作，即准备回应的东西；
            //在经过上述的操作后才能进行服务器的回应操作；
            socket.send(responsePacket);//进行回应客户端；

            //作为服务器一般都会进行日志的记录；所以完成一次请求回应操作，就进行一次日志的打印；
            System.out.printf("[%s:%d] request:%s,response:%s\n",
                    responsePacket.getAddress().toString()
            ,requestPacket.getPort(),request,response);
        }
    }
//进行请求的加工操作；
    public String process(String request){
        return request;
    }
    public static void main(String[] args) throws IOException {
        UdpEchoSever sever=new UdpEchoSever(9090);
        sever.start();
    }
}

